Final Embedded Programming
Back
Arduino Coding
#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>
// Wi-Fi Access Point credentials
const char* ssid = "Mani UWD";
const char* password = "FORGE";
// Motor pins - Updated to avoid boot-strapping pins
const int M1_PIN = D0; // GPIO2
const int M2_PIN = D1; // GPIO3
const int M3_PIN = D2; // GPIO4
const int M4_PIN = D3; // GPIO5
const int M5_PIN = D4; // GPIO6
const int M6_PIN = D5; // GPIO7
Servo motor1, motor2, motor3, motor4, motor5, motor6;
WebServer server(80);
// HTML interface
const char MAIN_page[] PROGMEM = R"rawliteral(
<!DOCTYPE html><html><head><title>Manikandan Fablab</title>
<style>
body { font-family: cursive; text-align: center; margin-top: 40px; background: #fcfcfc; }
h1 { font-size: 50px; color: rgb(189, 45, 134); }
.joystick-container { display: flex; justify-content: center; gap: 110px; margin-top: 50px; }
.joystick { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; gap: 10px; }
button {
font-size: 18px; padding: 10px 20px; margin: 10px; border: none; border-radius: 8px;
cursor: pointer; color: white; background-color: #e27a3e;
}
</style></head><body>
<h1>Manikandan Fablab</h1>
<div class="joystick-container">
<div class="joystick">
<div></div><button onclick="send('A')">F1</button><div></div>
<button onclick="send('B')">L1</button><button onclick="send('C')">S1</button><button onclick="send('D')">R1</button>
<div></div><button onclick="send('E')">B1</button><div></div>
</div>
<div class="joystick">
<div></div><button onclick="send('X')">F2</button><div></div>
<button onclick="send('Y')">L2</button><button onclick="send('Z')">S2</button><button onclick="send('O')">R2</button>
<div></div><button onclick="send('P')">B2</button><div></div>
</div>
</div>
<script>
function send(cmd) { fetch('/' + cmd).then(res => res.text()).then(console.log); }
</script></body></html>
)rawliteral";
// Stop all motors
void stopMotors() {
motor1.writeMicroseconds(1000);
motor2.writeMicroseconds(1000);
motor3.writeMicroseconds(1000);
motor4.writeMicroseconds(1000);
motor5.writeMicroseconds(1000);
motor6.writeMicroseconds(1000);
}
void setup() {
Serial.begin(115200);
motor1.attach(M1_PIN, 1000, 2000);
motor2.attach(M2_PIN, 1000, 2000);
motor3.attach(M3_PIN, 1000, 2000);
motor4.attach(M4_PIN, 1000, 2000);
motor5.attach(M5_PIN, 1000, 2000);
motor6.attach(M6_PIN, 1000, 2000);
delay(5000); // Allow ESCs to initialize
stopMotors();
WiFi.softAP(ssid, password);
Serial.print("WiFi started. Connect to: "); Serial.println(ssid);
Serial.print("Visit: http://"); Serial.println(WiFi.softAPIP());
server.on("/", []() { server.send_P(200, "text/html", MAIN_page); });
server.on("/A", []() { motor1.writeMicroseconds(1800); motor2.writeMicroseconds(1800); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Forward 1"); });
server.on("/B", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1800); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Left 1"); });
server.on("/E", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Right 1"); });
server.on("/D", []() { motor1.writeMicroseconds(1800); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Backward 1"); });
server.on("/C", []() { stopMotors(); server.send(200, "text/plain", "Stop 1"); });
server.on("/X", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1800); motor4.writeMicroseconds(1800); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Forward 2"); });
server.on("/Y", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1800); motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1800); server.send(200, "text/plain", "Left 2"); });
server.on("/P", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1800); motor6.writeMicroseconds(1800); server.send(200, "text/plain", "Right 2"); });
server.on("/O", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000); motor3.writeMicroseconds(1800); motor4.writeMicroseconds(1000); motor5.writeMicroseconds(1800); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Backward 2"); });
server.on("/Z", []() { stopMotors(); server.send(200, "text/plain", "Stop 2"); });
server.begin();
}
void loop() {
server.handleClient();
}
Code Explanation
- WiFi.h enables Wi-Fi functionality on the ESP32S3 board.
- WebServer.h allows the microcontroller to create a simple web server.
- ESP32Servo.h used to control ESCs (Electronic Speed Controllers) like servo motors via PWM pins.
- Sets the SSID and password for the board to act as a Wi-Fi hotspot.
- Assigns digital pins to six motors D0–D5 (GPIO2–GPIO7)
- Sets up a web server that listens on port 80 (HTTP default port).
- HTML Web Interface contains 2 joystick layouts, each with buttons (F, L, S, R, B) representing directions.
- Stops all motors by sending a neutral 1000µs signal (often used to arm or stop ESCs).
- Attaches each ESC to the corresponding pin and sets the PWM signal range (1000–2000 µs).
- When the root URL / is opened, the HTML page is served.